package Servicios;

import java.util.List;

import Negocio.Ruta;
import Persistencia.IRepository;
import Persistencia.QueryParameter;
import Persistencia.Repository;
import Persistencia.RepositoryException;

/**
 * DAO de Sucursal (Singleton) Esta clase se encarga de brindar las funciones
 * necesarias para manejar las <b>Sucursales</b> en la base de datos. Podremos
 * obtener todas las sucursales, una sucursal en particular, guardar o
 * actualizar una sucursal y eliminar una sucursal.
 *
 */
public class ServicioRutas {
	private IRepository<Ruta> repositorioRutas;
	private static ServicioRutas instance = null;

	private ServicioRutas() {
		this.repositorioRutas = new Repository<Ruta>();
	}

	public static ServicioRutas getInstance() {
		if (instance == null) {
			instance = new ServicioRutas();
		}
		return instance;
	}

	/**
	 * Funcion que retorna todas las sucursales de la base de datos
	 * 
	 * @return List<Sucursal> sucursales
	 * @throws ServiceException
	 */
	public List<Ruta> getRutas() throws ServiceException {
		List<Ruta> rutas;

		try {
			rutas = this.repositorioRutas.getAll(Ruta.class);
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}

		return rutas;
	}

	/**
	 * Se crea la ucursal en caso de que la misma no exista en la base de datos,
	 * de existir se realiza una actualizacion.
	 * 
	 * @param Sucursal
	 *            sucursal
	 * @throws ServiceException
	 */
	public void guardarOActualizar(Ruta ruta) throws ServiceException {
		try {
			this.repositorioRutas.saveOrUpdate(ruta);
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}
	}

	public Ruta getRuta(String nombreSucursalOrigen, String nombreSucursalDestino) throws RepositoryException {
		String queryExpression = "from Ruta c where c.sucursalOrigen.nombre = :nombreSucursalOrigen and c.sucursalDestino.nombre = :nombreSucursalDestino" ;
		QueryParameter parameter1 = new QueryParameter("nombreSucursalOrigen", nombreSucursalOrigen);
		QueryParameter parameter2 = new QueryParameter("nombreSucursalDestino", nombreSucursalDestino);
		Ruta ruta = this.repositorioRutas.get(queryExpression,
				parameter1, parameter2);
		return ruta;
	}
	
	

	public Boolean existeRuta(String nombreSucursalOrigen, String nombreSucursalDestino) throws RepositoryException {
		return this.getRuta(nombreSucursalOrigen, nombreSucursalDestino) != null;
	}

	/**
	 * Funcion para eliminar una sucursal de la base de datos
	 * 
	 * @param Sucursal
	 *            sucursal
	 * @throws RepositoryException
	 */
	public void eliminarRuta(Ruta ruta) throws RepositoryException {
		this.repositorioRutas.delete(ruta);
	}

}
